//#include <iostream>
//#include "ConcurrentAlloc.hpp"
////#include "FixedLengthMemoryPool.hpp"
//
//using std::cout;
//using std::endl;
//
//void SizeClassTest()
//{
//	// 对对齐映射规则的简单验证
//
//	size_t arr[] = { 1, 1023, 3457, 9 * 1024 + 5, 256 * 1024 };
//	size_t _arr[5];  // 存放其对齐字节数的
//	// 先计算其向上映射对齐字节数
//	int i = 0;
//	for (auto s : arr)
//	{
//		size_t tmp = SizeClass::RoundUp(s);
//		cout << s << ": " << tmp << endl;
//		_arr[i++] = tmp;
//	}
//
//	cout << "---------------------\n";
//	i = 0;
//	for (int j = 0; j < 5; j++)
//	{
//		size_t index1 = SizeClass::Index(arr[j]);
//		size_t index2 = SizeClass::IndexAlignSize(_arr[j]);
//		if (index1 == index2) cout << _arr[j] << ": " << index1 << endl;
//		else i = 1;
//	}
//	if (i) cout << "error!" << endl;
//}
//
//void TLSThread1()
//{
//	for (size_t i = 0; i < 6; ++i)
//	{
//		void* ptr = ConcurrentAlloc(7);
//	}
//}
//
//void TLSThread2()
//{
//	for (size_t i = 0; i < 6; ++i)
//	{
//		void* ptr = ConcurrentAlloc(9);
//	}
//}
//
//void TLSTest()
//{
//	// 测试是否存在线程安全问题 - 验证TLS是否可以帮助我们无锁访问
//	std::thread t1(TLSThread1);
//	t1.join();
//
//	std::thread t2(TLSThread2);
//	t2.join();
//}
//
//void ConcurrentAlloc1Test()
//{
//	// 申请流程单元测试
//	void* ptr1 = ConcurrentAlloc(1);
//	void* ptr2 = ConcurrentAlloc(8);
//	void* ptr3 = ConcurrentAlloc(8);
//	void* ptr4 = ConcurrentAlloc(2);
//	void* ptr5 = ConcurrentAlloc(3);
//	void* ptr6 = ConcurrentAlloc(6);
//}
//
//void ConcurrentAlloc2Test()
//{
//	// 测试向pagecache申请第二块span
//	for (size_t i = 0; i < 1024; ++i)
//	{
//		void* ptr = ConcurrentAlloc(6);
//	}
//
//	int* ptr = (int*)ConcurrentAlloc(4);
//
//}
//
//void PageToaddressTest()
//{
//	// 页号测试，测试在一段地址，可以映射到同一页号，方便根据地址找到对应申请的页号
//	//1234	
//	//		.... - > 1233
//	//1233
//	span_t num1 = 1233;  // 找到对应的地址
//	span_t num2 = 1234;
//
//	char* tmp1 = (char*)(num1 << PAGE_SHIFT);
//	char* tmp2 = (char*)(num2 << PAGE_SHIFT);
//
//	while (tmp1 <= tmp2)
//	{
//		cout << (span_t)tmp1 << "::" << ((span_t)tmp1 >> PAGE_SHIFT) << endl;
//		tmp1 += 8;  // 每次8字节的增加即可
//	} 
//
//
//}
//
//void ConcurrentFree1Test()
//{
//	// 非多线程环境下测试释放内存，调试过程中，应该需要观察到合并的总流程
//	void* ptr1 = ConcurrentAlloc(1); // 剩余:0 -maxsize 2  _useCount: 1
//	void* ptr2 = ConcurrentAlloc(4); // 剩余:1 -maxsize 3  _useCount: 3
//	void* ptr3 = ConcurrentAlloc(2); // 剩余:0
//	void* ptr4 = ConcurrentAlloc(8); // 剩余:2 -maxsize 4  _useCount: 6
//	void* ptr5 = ConcurrentAlloc(7); // 剩余:1
//	void* ptr6 = ConcurrentAlloc(5); // 剩余:0
//	void* ptr7 = ConcurrentAlloc(6); // 剩余:3 -maxsize 5  _useCount: 10
//
//	QiHai::LogMessage(QiHai::DEBUG, "%p", ptr1);
//	QiHai::LogMessage(QiHai::DEBUG, "%p", ptr2);
//	QiHai::LogMessage(QiHai::DEBUG, "%p", ptr3);
//	QiHai::LogMessage(QiHai::DEBUG, "%p", ptr4);
//	QiHai::LogMessage(QiHai::DEBUG, "%p", ptr5);
//	QiHai::LogMessage(QiHai::DEBUG, "%p", ptr6);
//	QiHai::LogMessage(QiHai::DEBUG, "%p", ptr7);
//
//	ConcurrentFree(ptr1);  // 剩余: 4
//	ConcurrentFree(ptr2);  // 剩余: 5  maxsize-5  _useCount: 10 - 5 = 5
//	ConcurrentFree(ptr3);  // 剩余: 1
//	ConcurrentFree(ptr4);  // 剩余: 2
//	ConcurrentFree(ptr5);  // 剩余: 3
//	ConcurrentFree(ptr6);  // 剩余: 4
//	ConcurrentFree(ptr7);  // 剩余: 5  maxsize-5  _useCount: 5 - 5 = 0
//}
//
//void FreeThread1()
//{
//	std::vector<void*> v(7);
//	for (int i = 0; i < 7; ++i)
//	{
//		v[i] = ConcurrentAlloc(7);
//	}
//
//	for (int i = 0; i < 7; ++i)
//	{
//		ConcurrentFree(v[i]);
//	}
//
//}
//
//void FreeThread2()
//{
//	std::vector<void*> v(7);
//	for (int i = 0; i < 7; ++i)
//	{
//		v[i] = ConcurrentAlloc(1);
//	}
//
//	for (int i = 0; i < 7; ++i)
//	{
//		ConcurrentFree(v[i]);
//	}
//}
//
//void ConcurrentFree2Test()
//{
//	// 多线程环境下测试正常三层流程
//	std::thread a(FreeThread1);
//	std::thread b(FreeThread2);
//
//	a.join();
//	b.join();
//}
//
//void BigAlloc()
//{
//	// 测试申请大块内存
//	void* ptr1 = ConcurrentAlloc(257 * 1024);  // 256kb(32page) ~ 128page
//	void* ptr2 = ConcurrentAlloc(129 * 8 * 1024);
//
//	ConcurrentFree(ptr1);
//	ConcurrentFree(ptr2);
//}

//int main()
//{
//	//TestFLMemoryPool();
//	//SizeClassTest();
//	//TLSTest();
//
//	//ConcurrentAlloc1Test();
//	//ConcurrentAlloc2Test();
//	//PageToaddressTest();
//
//	ConcurrentFree1Test();
//	//ConcurrentFree2Test();
//
//	BigAlloc();
//	return 0;
//}

